cmake_minimum_required(VERSION 3.16)
project(untitled C)

set(CMAKE_C_STANDARD 99)

#支持gdb
set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS}" -O3 -Wall)

#设置安装目录
set(CMAKE_INSTALL_PREFIX  .)

#给项目添加和维护版本号是一个好习惯，这样有利于用户了解每个版本的维护情况，并及时了解当前所用的版本是否过时，或是否可能出现不兼容的情况。
#在project命令之后添加如下两行，分别指定当前的项目的主版本号和副版本号
#之后为了在代码中获取版本信息，我们可以修改congfig.h.in文件，添加两个预定义变量
set(Untitled_VERSION_MAJOR 1)
set(Untitled_VERSION_MINOR 0)


#有时候可能要对系统环境做点检查，例如要使用一个平台相关的特性的时候。在这个例子中，我们检查系统是否自带pow函数。如果带有pow函数，就使用它；否则使用我们定义的power函数
#添加CheckFunctionExists宏
#首先在顶层CMakeLists文件中添加CheckFunctionExists.cmake宏，并调用check_func_exists命令测试链接器是否能再链接阶段找到pow函数
#检查系统是否支持pow函数
include(${CMAKE_ROOT}/Modules/checkFunctionExists.cmake)
check_function_exists(pow HAVE_POW)
#这段代码放在configure_file命令前

#加入一个配置头文件用于处理CMake对源码的设置
configure_file(
        "${PROJECT_SOURCE_DIR}/config.h.in"
        "${PROJECT_BINARY_DIR}/config.h"
)

#是否使用自己的testfunc库
option(USE_MYTEST
        "Use provided math implementation" ON)

#是否加入testfunc库
if (USE_MYTEST)
    include_directories("${PROJECT_SOURCE_DIR}/test")
    add_subdirectory(test)
    set (EXTRA_LIBS ${EXTRA_LIBS} testfunc)
endif(USE_MYTEST)

#查找当前目录下的所有源文件
#并将名称保存到DIR_SRCS变量
aux_source_directory(. DIR_SRCS)
#添加math子目录
#add_subdirectory(test)
#add_executable(untitled main.c test.c test.h)
#指定生成目标
add_executable(untitled ${DIR_SRCS})

#添加链接库
target_link_libraries(untitled ${EXTRA_LIBS})

#cmake -G "MinGW Makefiles"
#在windows下生成Makefile

#cmake -G "MinGW Makefiles" -D USE_MYTEST=off
#cmake -G "MinGW Makefiles" -D USE_MYTEST=on

#配置安装规则
#指定安装路径
install(TARGETS untitled DESTINATION bin)
install(FILES "${PROJECT_BINARY_DIR}/config.h"
        DESTINATION include)

#启用测试
enable_testing()
#测试程序是否成功运行
add_test(test_run untitled)
#测试帮助信息是否可以正常提示
add_test(test_usage untitled)
set_tests_properties(test_usage
        PROPERTIES PASS_REGULAR_EXPRESSION "Usage: .* base exponent")

#测试输入其他参数
add_test(test_other untitled 1)
set_tests_properties(test_other
        PROPERTIES PASS_REGULAR_EXPRESSION "other")

#定义一个宏，用来简化测试工作
macro(dotest arg1 arg2 result)
    add_test(test_${arg1}_${arg2} untitled ${arg1} ${arg2})
    set_tests_properties(test_${arg1}_${arg2}
            PROPERTIES PASS_REGULAR_EXPRESSION ${result})
endmacro()

#使用宏测试
dotest(3 4 "other")
dotest(2 5 "other")

#本节学习如何配置生成各种平台上的安装包，包括二进制安装包和源码安装包。为了完成这个任务，我们需要用到CPACK
#在CMakeLists.txt下添加下面几行
#构建一个CPACK安装包
include(InstallRequiredSystemLibraries)
set(CPACK_RESOURCE_FILE_LICENSE
        "${CMAKE_CURRENT_SOURCE_DIR}/License.txt")
set(CPACK_PACKAGE_VERSION_MAJOR "${Untitled_VERSION_MAJOR}")
set(CPACK_PACKAGE_VERSION_MINOR "${Untitled_VERSION_MINOR}")
include(CPack)
#上面的代码做了以下几个工作
#1、导入InstallRequiredSystemLibraries模块，以便以后导入CPack模块
#2、设置一些CPack相关变量，包括版权信息和版本信息，其中版本信息用了上一节定义的版本号
#3、导入CPack模块
#执行cmake命令后，会在当前目录生成cmake文件
#cpack -C CPackConfig.cmake生成二进制安装包
#cpack -C CPackSourceConfig.cmake生成源码安装包